package com.example.emqx.controller;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.example.emqx.entity.EmqAuth;
import com.example.emqx.pojo.AuthRequest;
import com.example.emqx.service.EmqAuthService;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import jakarta.annotation.PostConstruct;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

import java.util.HashMap;
import java.util.Map;

/**
 * File: AuthController.java
 * Author: liufudong@szyh-smart.com
 * Date: 2024/8/29
 * Description: AuthController class.
 * 文档在https://docs.emqx.com/zh/emqx/latest/access-control/authn/http.html
 */
@RestController
@RequestMapping("/mqtt")
@Slf4j
public class AuthController {
    //http://192.168.0.103:9000/mqtt/auth?username=张三&password=1&clientid=1
    //curl -X POST -d
    @Autowired
    private EmqAuthService emqAuthService;
    @Qualifier("objectMapper")
    @Autowired
    private ObjectMapper objectMapper;

    @PostConstruct
    public void init() {
//        users = new HashMap<>();
//        users.put("user", "123456");//实际的密码应该是密文,mqtt的http认证组件传输过来的密码是明文，我们需要自己进行加密验证
//        users.put("emq-client2", "123456");
//        users.put("emq-client3", "123456");
    }

    /**
     * 如果设置为设置为超级用户，不会走ACL认证了
     */
    @PostMapping(path = "/auth")
    public ResponseEntity<Map<String, Object>> authenticate(
            @RequestBody AuthRequest authRequest
    ) throws JsonProcessingException {
        String clientid = authRequest.getClientid();
        String username = authRequest.getUsername();
        String password = authRequest.getPassword();
        log.info("loginAuth clientid:{},username:{},password:{}",
                clientid, username, password);
        LambdaQueryWrapper<EmqAuth> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(EmqAuth::getUsername, username)
                .eq(EmqAuth::getPassword, password);
        EmqAuth emqAuth = emqAuthService.getOne(queryWrapper);

        log.info("loginAuth EmqAuth:{}",
                objectMapper.writeValueAsString(emqAuth));

        // 创建返回数据的Map
        Map<String, Object> response = new HashMap<>();

        // 这里根据业务逻辑判断用户是否认证通过
        if (emqAuth != null) {
            // 认证成功，允许连接
            response.put("result", emqAuth.getResult());
            boolean flag = false;
            if (emqAuth.getIsSuperuser() == 1) {
                flag = true;
            }
            response.put("is_superuser", flag); // 可选：设置为超级用户

            // 可选：添加客户端属性
//                Map<String, String> clientAttrs = new HashMap<>();
//                clientAttrs.put("role", "admin");
//                clientAttrs.put("sn", "10c61f1a1f47");
//                response.put("client_attrs", clientAttrs);
        } else {
            // 认证失败，拒绝连接
            response.put("result", "deny");
            response.put("is_superuser", false); // 默认不是超级用户
        }

        // 返回 HTTP 200 OK 和 JSON 格式的响应
        return ResponseEntity.ok(response);
    }

//    1. 发送表单数据
//    使用 curl 发送表单数据
//
//    你可以使用 curl 发送带有表单数据的 POST 请求，如下所示：
//
//    bash
//            复制代码
//    curl -X POST -d "clientid=123&username=user&password=pass" http://localhost:8080/auth
//    使用 Postman 发送表单数据
//
//    打开 Postman。
//    设置请求类型为 POST。
//    在 Body 选项中选择 x-www-form-urlencoded。
//    添加参数 clientid、username 和 password，并填写对应的值。
//    @PostMapping("/auth")
//    public ResponseEntity<?> auth(@RequestParam("clientid") String clientid,
//                                  @RequestParam("username") String username,
//                                  @RequestParam("password") String password) {
//        log.info("loginAuth clientid:{},username:{},password:{}",
//                clientid, username, password);
////在此处可以进行复杂也的认证逻辑,但是我们为了演示方便做一个固定操作
//        String value = users.get(username);
////        if (StringUtils.isEmpty(value)) {
////            return new ResponseEntity<Object>(HttpStatus.UNAUTHORIZED);
////        }
////        if (!value.equals(password)) {
////            return new ResponseEntity<Object>(HttpStatus.UNAUTHORIZED);
////        }
//        return new ResponseEntity<Object>(HttpStatus.OK);
//    }
}
